package com.gitee.openviducn.inspector.domain.vo.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;

/**
 *
 * 相关参考文档：<br>
 * <a href="http://openvidu_cn.gitee.io/openvidu_docs_cn/docs/reference-docs/openvidu-server-webhook/">
 *  OpenVidu Server Webhook
 * </a><br>
 * <a href="http://openvidu_cn.gitee.io/openvidu_docs_cn/docs/reference-docs/openvidu-server-cdr/">
 *  OpenVidu Server CDR 通话细节记录
 * </a>
 *
 * @Author: https://gitee.com/wesleyOne
 * @Date: 02.29 2020
 */
@ApiModel(value = "OpenVidu的webhook_CDR请求体")
@Getter
@Setter
public class WebhookCDRRequest extends BaseRequest{
    private static final long serialVersionUID = 1812189286371445272L;

    /**
     * 事件类型
     * @see com.gitee.openviducn.inspector.enums.CDREventEnum
     */
    private String event;
    /**
     * 触发事件会话的唯一标识符
     * 例如：fds4e07mdug1ga3h
     */
    private String sessionId;
    /**
     * 触发事件的时间戳 毫秒
     * 例如：1538481699154
     */
    private Long timestamp;
    private String timestampStr;
    /**
     * 对应事件的开始时间 毫秒
     * 例如：1538481330577
     *
     *  sessionDestroyed            会话开始时间
     *  participantLeft             参与者加入会话时间
     *  webrtcConnectionDestroyed   连接创建时间
     *  recordingStatusChanged      录制开始时间
     */
    private Long startTime;
    private String startTimeStr;
    /**
     * 对应事件的持续时间 秒
     * 例如: 368 或者 5.967
     *
     *  sessionDestroyed    会话的持续时间
     *  participantLeft     参与者参与会话的持续时间
     *  webrtcConnectionDestroyed   媒体流的持续时间
     *  recordingStatusChanged      录制文件的时长（特殊有小数）
     */
    private Double duration;
    /**
     * 事件产生原因
     *
     * @see com.gitee.openviducn.inspector.enums.CDRReasonEnum
     */
    private String reason;

    /**
     * 参与者的唯一标识
     * 例如：wsalcr1r72goj8sk
     * TODO 待确认和TOKEN的关系
     *
     * 仅 participantJoined、participantLeft、
     * webrtcConnectionCreated、webrtcConnectionDestroyed
     */
    private String participantId;
    /**
     * 参与者的地理位置 "CITY, COUNTRY"格式字符串 (或者 "unknown")
     * 例如：Berlin, Germany
     * 仅 participantJoined、participantLeft，并且是商业版本才有
     */
    private String location;
    /**
     * 参与者用于连接到会话的平台的完整说明
     * 例如：Chrome 69.0.3497.81 on OS X 10.13.6 64-bit
     * 仅 participantJoined、participantLeft
     */
    private String platform;

    /**
     * 媒体连接类型
     *  "INBOUND"连接（参与者正在从OpenVidu接收媒体）
     *  "OUTBOUND"连接（参与者正在将媒体发送到OpenVidu）
     */
    private String connection;
    /**
     * 如果 connection 是 "INBOUND"，
     * 则是接收到的媒体流的来源参与者的唯一标识
     */
    private String receivingFrom;
    /**
     * 媒体连接是否已开启音频
     */
    private Boolean audioEnabled;
    /**
     * 媒体连接是否已开启视频
     */
    private Boolean videoEnabled;
    /**
     * 如果 videoEnabled 是 true，
     * 该字段表示传输视频的类型
     *  "CAMERA" 摄像头
     *  "SCREEN" 共享桌面
     */
    private String videoSource;
    /**
     * 如果 videoEnabled 是 true，
     * 该字段表示传输视频的帧率
     * 	fps单位
     */
    private Integer videoFramerate;
    /**
     * 如果 videoEnabled 是 true，
     * 该字段表示传输视频的尺寸 分辨率
     * 例如"1920x1080"
     */
    private String videoDimensions;


    /*
     * memberId : TestSession
     * name : MyRecording
     * outputMode : COMPOSED
     * hasAudio : false
     * hasVideo : true
     * recordingLayout : BEST_FIT
     * resolution : 1920x1080
     * size : 0
     * duration : 0.0
     */

    /**
     * 录制对象的唯一标识
     * 例如：TestSession
     */
    private String id;
    /**
     * 录制文件的名称
     * 例如：MyRecording
     */
    private String name;
    /**
     * 录制的输出模式
     *      COMPOSED    布局合并
     *      INDIVIDUAL  独立文件
     */
    private String outputMode;
    /**
     * 录制是否有音频
     */
    private Boolean hasAudio;
    /**
     * 录制是否有视频
     */
    private Boolean hasVideo;
    /**
     * 录制使用的布局类型。
     * 只有 outputMode 是 COMPOSED
     * 并且 hasVideo 是 true时才存在
     *
     * @see io.openvidu.java.client.RecordingLayout
     */
    private String recordingLayout;
    /**
     * 录制文件的分辨率
     * 只有 outputMode 是 COMPOSED
     * 并且 hasVideo 是 true时才存在
     * 例如："1280x720"
     */
    private String resolution;
    /**
     * 视频文件的大小 字节
     */
    private Long size;
    /**
     * 录制状态
     * "started","stopped","ready","failed"
     */
    private String status;
}
